from launch import LaunchDescription
from launch_ros.actions import Node
# 封装终端指令相关类--------------
# from launch.actions import ExecuteProcess
# from launch.substitutions import FindExecutable
# 参数声明与获取-----------------
# from launch.actions import DeclareLaunchArgument
# from launch.substitutions import LaunchConfiguration
# 文件包含相关-------------------
# from launch.actions import IncludeLaunchDescription
# from launch.launch_description_sources import PythonLaunchDescriptionSource
# 分组相关----------------------
# from launch_ros.actions import PushRosNamespace
# from launch.actions import GroupAction
# 事件相关----------------------
# from launch.event_handlers import OnProcessStart, OnProcessExit
# from launch.actions import ExecuteProcess, RegisterEventHandler,LogInfo
# 获取功能包下share目录路径-------
from ament_index_python.packages import get_package_share_directory
import os
""" 
    需求：演示Node使用
    构造函数参数说明：

        :param: executable 可执行程序；T
        :param: package 被执行的程序所属的功能包；T
        :param: name 节点名称；T
        :param: namespace 设置命名空间；T
        :param: exec_name 设置程序标签；F
        :param: parameters 设置参数；F
        :param: remappings 话题重映射
        :param: ros_arguments 为节点传参
                            --ros-args xx yy
        :param: arguments 为节点传参
                            xx yy --ros-args

 """

def generate_launch_description():
    rqt_node = Node(
        package="rqt_gui",           # rqt_gui 是 rqt 的 ROS 2 包名
        executable="rqt_gui",         # 可执行文件名称
        name="rqt_gui_node",          # 节点名称
        respawn=False,                # 不需要自动重启
        output="screen",              # 输出信息到屏幕
        # 如果你需要传递启动参数给 rqt，可以通过 ros_arguments 或 arguments 实现
        #ros_arguments=["--start", "rqt_graph"]  # 启动时自动打开 rqt_graph（可选）
    )
    #话题转换节点，ap/cmd_vel->cmd_vel
    twist =  Node(
           package="twist_stamper",        # twist_stamper 是 ROS 2 包名
        executable="twist_stamper",     # 可执行文件名称
        name="twist_stamper_node",      # 节点名称
        respawn=False,                  # 不需要自动重启
        output="screen",                # 输出信息到屏幕
        # parameters=[],                  # 如果需要传递其他参数，可以添加在这里
        remappings=[                    # 对 topic 进行重映射
            ('cmd_vel_in', 'cmd_vel'),   # 重映射 cmd_vel_in 到 cmd_vel
            ('cmd_vel_out', '/ap/cmd_vel')  # 重映射 cmd_vel_out 到 /ap/cmd_vel
            ],
        arguments=["--ros-args", "-p", "frame_id:=base_link"]  # 启动时设置参数 frame_id   
        )
    #t1 = Node(
     #       package="turtlesim",
      #      executable="turtlesim_node",
       #     exec_name="exec_name_t1",
        #    ros_arguments=["--remap","__ns:=/t2"],
            #ros2 run turtlesim turtlesim_node --ros-args --remap __ns:=/t3 rqt工具查看
         #   name="t1")#（功能包，可执行程序，名字）
    # t2 = Node(
            # package="turtlesim",
            # executable="turtlesim_node",
            # respawn = True,     #自动重启
            #方式1
            #parameters=[{"background_r": 255,"background_g": 0,"background_b": 0}],  
            #方式2（常用），读取Yaml文件（通过Ymal绝对路径读取）
            #ros2 param dump t2 --output-dir src/cpp01_launch/config保存节点参数到文件，执行这条命令时要保证节点正在运行
            #parameters=["/home/ros2/ws02_tools/src/cpp01_launch/config/t2.yaml"],
            #优化：动态获取路径
            # parameters=[os.path.join(get_package_share_directory("cpp01_launch"),"config","t2.yaml")],

            # name="t2")#（功能包，可执行程序，名字）

    return LaunchDescription([twist,rqt_node])